package utils //将本文件打包，方便其他文件调用

import (
	"fmt"
	"strconv"
	"strings"
	"time"
)

func Cal(n1 float64, n2 float64, operation byte) float64 { //为了让其他文件调用，函数首字母需要大写，类似其他语言的public

	var res float64
	switch operation {
	case '+':
		res = n1 + n2
	case '-':
		res = n1 - n2
	case '*':
		res = n1 * n2
	case '/':
		res = n1 / n2
	default:
		fmt.Println("你输入的操作符无法识别...")
	}
	return res
}

func Str() {
	//0.字符串和数字之间的转换
	a := "12"
	c, _ := strconv.Atoi(a) //atoi函数返回一个数字和err
	d := strconv.Itoa(c)    //itoa只返回字符串
	fmt.Println(c+1, d+"1")
	//1.查找子串是否在指定字符串中
	b := strings.Contains("hello,world", "llo")
	fmt.Println(b)
	//2.统计一个字符串有几个指定的子串
	num := strings.Count("hello,world", "l")
	fmt.Println(num)
	//3.不区分大小写的字符串比较，"=="是区分大小写的
	fmt.Println(strings.EqualFold("abc", "ABC"), "abc" == "ABC")
	//4.返回子串在字符串第一次出现的位置，没有的话返回-1
	fmt.Println(strings.Index("hello,world", "llo")) //2,从0开始计数
	//5.返回子串最后一次出现的位置
	fmt.Println(strings.LastIndex("hello,world", "o")) //7,逗号也占一个位置
	//6.替换字符串，-1代表全替换，也可以指定替换几个
	str1 := "go go hello"
	fmt.Println(strings.Replace(str1, "go", "world", -1))
	//7.按照指定的某个字符作为分割符，将一个字符串拆分成字符串数组
	fmt.Println(strings.Split("hello-world!-what-are-you-doing-?", "-"))
	//8.对字符串进行大小写转换
	fmt.Println(strings.ToLower("Hello-World"), strings.ToUpper("Hello-World"))
	//9.去掉字符串左右两边空格
	fmt.Println(strings.TrimSpace(" hello world! "))
	//10.去掉左右两边指定字符
	fmt.Println(strings.Trim("hello!", "!")) //最后有空格的话符号也是去不掉的，请注意空格也是字符
	//11.指定去掉哪一边字符
	fmt.Println(strings.TrimLeft("!hello!", "!"), strings.TrimRight("!hello!", "!"))
	//12.判断字符串是否以指定的字符串开头或者结尾
	fmt.Println(strings.HasPrefix("hello", "he"), strings.HasSuffix("hello", "llo"))
}

func DateTime() {
	//1.获取当前时间
	now := time.Now()
	//fmt.Printf("now=%v type=%T\n", now, now)
	//2.通过now获取年月日,时分秒
	fmt.Printf("年月日：%v-%v-%v,时分秒：%v:%v:%v\n", now.Year(), int(now.Month()), now.Day(), now.Hour(), now.Minute(), now.Second())
	str := fmt.Sprintf("年月日：%v-%v-%v,时分秒：%v:%v:%v", now.Year(), int(now.Month()), now.Day(), now.Hour(), now.Minute(), now.Second())
	fmt.Println(str)
	//3.格式化日期时间"2006-01-02 15:04:05",数字是固定的，可以取出时间对应位置的值格式化表示
	fmt.Printf(now.Format("2006-01-02 15:04:05\n"))
	fmt.Printf(now.Format("01-02\n"))
	fmt.Printf(now.Format("2006/01/02\n"))
	//4.时间的常量与休眠,常量可以在程序中获取指定单位的时间
	fmt.Println(time.Hour, time.Minute)
	time.Sleep(time.Second/10 + time.Millisecond + time.Microsecond + 100*time.Nanosecond)
	//5.每隔0.1秒打印一个数字，到5时退出
	for i := 1; ; i++ {
		fmt.Printf("%d\t", i)
		time.Sleep(100 * time.Millisecond)
		if i == 5 {
			break
		}
	}
	//6.Unix和UnixNano的使用
	fmt.Println("\n", now.Unix(), now.UnixNano())

}

func Buildinfunc() {
	num1 := 100
	fmt.Printf("num1的类型=%T,num1的值=%v,num1的地址=%v\n", num1, num1, &num1)
	num2 := new(int)
	fmt.Printf("num2的类型=%T,num2的值=%v,num2的地址=%v,num2这个指针指向的值为%d\n", num2, num2, &num2, *num2)
	*num2 = 10
	fmt.Printf("num2的类型=%T,num2的值=%v,num2的地址=%v,num2这个指针指向的值为%d\n", num2, num2, &num2, *num2)

}
